# -*- coding: utf-8 -*-
"""
# @created on : 9月 2021/9/17 15:14
# @author     : kevin
# @file       : variable.py
# @software   : PyCharm
# @project    : auto_interface_test


@license: (C) Copyright 2019-2025, Corporation Limited.
@desc:
"""
from common.logger import Logger
from utils.operation_response import OperationResponse
from common.get_verifyentry import GetValidCode
from utils.operation_mysql import OpertionMysql
from utils.operation_ini import OperationIni
# 设置全局变量，用例存储用例变量
key_list = []
variable_list = []
variable_value = []


class OperationVariable:
    def __init__(self):
        self.log = Logger()
        # 变量列表，用来存储当前测试用例中所有定义的变量，变量名不能重复
        self.key_list = key_list
        # 后置变量列表，用来记录变量名以及对应的提取返回值的函数
        self.variable_list = variable_list
        # 前置变量名，用例存储变量以及提取到的变量值，用于后续请求中替换参数对应的值
        self.variable_value = variable_value
        self.op_json = OperationResponse()
        self.valid = GetValidCode()
        if OperationIni().read_cfg('main', 'mysql') == 'on':
            self.sql = OpertionMysql()

    def is_key(self, key):
        """
        判断变量在当前执行中是否存在
        :param key: 变量名
        :return: 存在则返回True，否则返回False
        """
        flg = False
        try:
            self.key_list.index(key)
            flg = True
        except:
            flg = False
        finally:
            return flg

    def index_key_list(self, key):
        """
        获取变量在返回变量表中的索引值
        :param key: 变量名
        :return: 存在返回索引值，不存在返回None
        """
        idx = None
        for i in range(0, len(self.variable_list)):
            if key in self.variable_list[i]:
                inx = i
        return idx

    def get_index_key_by_value(self, key):
        """
        获取变量在前置变量表中的索引值
        :param key: 变量名
        :return: 存在返回索引值，不存在返回None
        """
        idx = None
        for i in range(0, len(self.variable_value)):
            if key in self.variable_value[i]:
                idx = i
        return idx

    def get_value_from_key_value(self, key):
        """
        获取前置变量表中变量的值
        :param key: 变量名
        :return: 存在则返回值，为空则返回None
        """
        value = None
        idx = self.get_index_key_by_value(key)
        if idx is not None:
            value = self.variable_value[idx][key]
        return value

    def create_variable_value(self, key):
        """
        创建初始前置变量表，用于存储变量名以及后续获取到的变量值，初始化时变量值为空
        :param key: 变量名
        :return: True
        """
        self.variable_value.append({key: ''})
        return True

    def create_variable_list(self, key, value):
        """
        根据变量列表提取变量名以及变量函数，变量之间以";"分隔，一次可以传入多个变量，
        拆分变量列表并判断变量是否在变量列表中存在，不存在则插入变量列表中，
        同时在后置变量表中插入变量名以及对应的变量参数
        在前置变量表中插入变量名，值为空
        :param quantily: 变量列表
        :return:
        """
        if self.is_key(key):
            self.log.logger('error', f'{key}已存在！！')
        else:
            self.key_list.append(key)
            self.variable_list.append({key: value})
            self.create_variable_value(key)
            self.log.logger('info', f'增加变量{key}')
        return True

    def update_variable_value(self, key, value):
        """
        更新变量列表的值
        :param key: 变量名
        :param value: 获取到的变量值
        :return: 更新成功返回True，否则返回False
        """
        flg = None
        idx = self.get_index_key_by_value(key)
        if idx is not None:
            self.variable_value[idx][key] = value
            flg = True
        else:
            flg = False
        return flg

    def update_variable(self, key, res):
        """
        更新变量列表，取数据提取参数列表，通过其创建全局变量列表，同时从返回值中提取变量值，更新进变量列表中
        :param key: 后置变量列表
        :param res:请求返回值
        :return:
        """
        key_list = key.split(';')
        for i in range(0, len(key_list)):
            k = key_list[i].split('=')[0]
            vari = key_list[i].split('=')[1]
            self.create_variable_list(key=k, value=vari)
            if vari == 'imgvalid':
                value = self.valid.get_img_code(res.content)
            elif k == 'sql':
                value = self.sql.get_result_by_sql(vari)
            else:
                value = self.op_json.get_value_from_json_by_key(response=res, key=vari)
            self.update_variable_value(k, value)
        return True

    def get_variables_value(self):
        """
        获取全局变量接口
        :return: 当前系统全局变量
        """
        return self.variable_value





